package com.rchat.pocmini.message;

import com.airtalkee.sdk.AirtalkeeMessage;
import com.airtalkee.sdk.OnMessageListener;
import com.airtalkee.sdk.OnMessagePttListener;
import com.airtalkee.sdk.entity.AirContact;
import com.airtalkee.sdk.entity.AirMessage;
import com.airtalkee.sdk.entity.AirSession;

import java.util.List;

/**
 * Created by ljd on 2017/2/8.
 * <p>
 * AirtalkeeMessage 接口规范
 */

public interface PocAirtalkeeMessageInterface {

    /**
     * 注册监听器，关心OnMessageListener事件的实例，均需要通过此接口注册，
     * 否则将收不到相应事件
     *
     * @param listener 监听器
     */
    void setOnMessageListener(OnMessageListener listener);

    /**
     * 设置语音本地缓存文件存放路径
     *
     * @param recordPath 文件存放路径
     */
    void setMessageRecordPath(String recordPath);


    /**
     * 发送用户即时消息（指定Session发送即时消息），事件返回OnMessageListener.onMessageOutgoingSent
     *
     * @param session          所在会话的Session实例
     * @param body             支持普通文本消息：isCustom为true时body可以是json形式的自定义报文
     * @param isCustom         是否为自定义消息
     * @param allowOfflineSend 是否允许离线发送
     */
    AirMessage messageSend(AirSession session, String body, boolean isCustom, boolean allowOfflineSend);


    /**
     * 发送用户即时消息（指定用户列表发送即时消息），事件返回OnMessageListener.onMessageOutgoingSent
     *
     * @param contacts         指定用户列表作为消息发送目标
     * @param body             支持普通文本消息：isCustom为true时body可以是json形式的自定义报文
     * @param isCustom         是否为自定义消息
     * @param allowOfflineSend 是否允许离线发送
     */
    AirMessage messageSend(List<AirContact> contacts, String body, boolean isCustom, boolean allowOfflineSend);

    /**
     * 发送用户即时消息（指定用户发送即时消息），事件返回OnMessageListener.onMessageOutgoingSent
     *
     * @param contact          指定某一个用户作为消息发送目标
     * @param body             支持普通文本消息：isCustom为true时body可以是json形式的自定义报文
     * @param isCustom         是否为自定义消息
     * @param allowOfflineSend 是否允许离线发送
     */
    AirMessage messageSend(AirContact contact, String body, boolean isCustom, boolean allowOfflineSend);

    /**
     * 发送用户即时消息（指定频道发送即时消息），事件返回OnMessageListener.onMessageOutgoingSent
     *
     * @param channelId        指定频道的ID作为消息发送目标
     * @param body             支持普通文本消息：isCustom为true时body可以是json形式的自定义报文
     * @param isCustom         是否为自定义消息
     * @param allowOfflineSend 是否允许离线发送
     */
    AirMessage messageSend(String channelId, String body, boolean isCustom, boolean allowOfflineSend);

    /**
     * 开始录音即时消息（开始语音消息录制），事件返回onMessageListener.onMessageRecordStart
     *
     * @param session          指定会话的AirSession对象
     * @param allowOfflineSend 是否允许离线发送
     */
    void messageRecordStart(AirSession session, boolean allowOfflineSend);

    /**
     * 开始录音即时消息（开始语音消息录制），事件返回onMessageListener.onMessageRecordStart
     *
     * @param contact          指定发送目标用户的AirContact实例
     * @param allowOfflineSend 是否允许离线发送
     */
    void messageRecordStart(AirContact contact, boolean allowOfflineSend);

    /**
     * 开始录音即时消息（开始语音消息录制），事件返回onMessageListener.onMessageRecordStart
     *
     * @param contacts         指定多个发送目标的AirContact实例列表
     * @param allowOfflineSend 是否允许离线发送
     */
    void messageRecordStart(List<AirContact> contacts, boolean allowOfflineSend);

    /**
     * 开始录音即时消息（开始语音消息录制），事件返回onMessageListener.onMessageRecordStart
     *
     * @param channel          指定频道ID
     * @param allowOfflineSend 是否允许离线发送
     */
    void messageRecordStart(String channel, boolean allowOfflineSend);

    /**
     * 重发语音即时消息（重发本地缓存的语音消息）,事件返回OnMessageListener.onMessageOutgoingSent
     *
     * @param contact          指定发送目标用户的AirContact实例
     * @param msgCode          预重发的消息Code，来自AirMessage.getMessageCode()
     * @param msgResId         预重发的语音消息资源ID，来自AirMessage.getImageUri()
     * @param msgRecordSeconds 与发送的语音消息时长（单位秒），来自AirMessage.getImageLength（）
     * @param allowOfflineSend 是否允许离线发送
     */
    void messageRecordResend(AirContact contact, String msgCode, String msgResId, int msgRecordSeconds, boolean allowOfflineSend);

    /**
     * 重发语音即时消息（重发本地缓存的语音消息）,事件返回OnMessageListener.onMessageOutgoingSent
     *
     * @param contacts         指定发送目标用户的AirContact实例列表
     * @param msgCode          预重发的消息Code，来自AirMessage.getMessageCode()
     * @param msgResId         预重发的语音消息资源ID，来自AirMessage.getImageUri()
     * @param msgRecordSeconds 与发送的语音消息时长（单位秒），来自AirMessage.getImageLength（）
     * @param allowOfflineSend 是否允许离线发送
     */
    void messageRecordResend(List<AirContact> contacts, String msgCode, String msgResId, int msgRecordSeconds, boolean allowOfflineSend);

    /**
     * 重发语音即时消息（重发本地缓存的语音消息）,事件返回OnMessageListener.onMessageOutgoingSent
     *
     * @param channelId        指定目标频道ID
     * @param msgCode          预重发的消息Code，来自AirMessage.getMessageCode()
     * @param msgResId         预重发的语音消息资源ID，来自AirMessage.getImageUri()
     * @param msgRecordSeconds 与发送的语音消息时长（单位秒），来自AirMessage.getImageLength（）
     * @param allowOfflineSend 是否允许离线发送
     */
    void messageRecordResend(String channelId, String msgCode, String msgResId, int msgRecordSeconds, boolean allowOfflineSend);

    /**
     * 结束或取消语音即时消息录制
     *
     * @param isCancel false为正常结束进行消息发送，true为用户取消刚录制的语音
     */
    void messageRecordStop(boolean isCancel);

    /**
     * 开始播放语音即时消息（开始播放一条指定的语音消息，播放完成后，会自动停止）
     * 事件返回onMessageListener,onMessageRecordPlayStart()
     *
     * @param msgCode  消息Code，来自AirMessage.getMessageCode()
     * @param msgResId 语音消息资源ID，来自AirMessage.getImageURI()
     */
    void messageRecordPlayStart(String msgCode, String msgResId);

    /**
     * 开始播放语音即时消息（开始播放一条指定的语音消息，播放完成后，会自动停止）
     * 事件返回onMessageListener,onMessageRecordPlayStart()
     *
     * @param msg 预播放语音消息的AirMessage实例
     */
    void messageRecordPlayStart(AirMessage msg);

    /**
     * 预加载语音消息数据（用户可在调用MessageRecordPlayStart之前调用此接口，以从网络服务中心预加载语音数据。
     * 此接口并非必须，即使不调用此接口，MessageRecordPlayStart接口也会依据当前状态进行加载。）
     * 事件返回onMessageListener.onMessageRecordPlayLoading和onMessageListener.onMessageRecordPlayLoaded
     *
     * @param msg AirMessage
     */
    void messageRecordPlayDownload(AirMessage msg);

    /**
     * 停止正在播放的语音消息，事件返回onMessageListener.onMessageRecordPlayStop
     */
    void messageRecordPlayStop();

    /**
     * 清除语音消息本地文件（删除指定语音消息）
     *
     * @param resId 语音消息资源ID
     * @return 是否删除成功
     */
    boolean recordFileClean(String resId);

    /**
     * 清除语音消息本地文件（删除指定语音消息）
     *
     * @param resIds 语音消息资源ID列表
     * @return 是否删除成功
     */
    boolean recordFileClean(String[] resIds);

    /**
     * 清除全部语音消息本地文件（删除全部语音消息）
     *
     * @return 是否删除成功
     */
    boolean recordFileCleanAll();

    /**
     * 注册监听器，设置本地录制事件回调的实例
     *
     * @param listener 监听器
     */
    void setOnMessagePttListener(OnMessagePttListener listener);
}
